﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using DTO.Projectos;
using DTO;

namespace Control
{

    enum Evento {

        Favoravel = 0,
        Desfavoravel = 1,
        Suspender = 2,
        Reactivar = 3,
        Reforçar = 4,
        Fechar = 5
    }
   
    class GestaoFase
    {

        public static readonly Estados[,] matrizTransicao = new Estados[,]{

                                 //    Favoravel                Desfavoravel            Suspender           Reactivar               Reforçar                        Fechar
            /*Candidatura*/      { Estados.DespachoAbertura, Estados.Arquivado,     Estados.Suspenso,   Estados.Indefinido,     Estados.Indefinido,         Estados.Indefinido  },
            /*DespachoAbertura*/ { Estados.AnaliseTecnica,   Estados.Indefinido,    Estados.Suspenso,   Estados.Indefinido,     Estados.Indefinido,         Estados.Indefinido },
            /*AnaliseTecnica*/   { Estados.DespachoDecisao,  Estados.Arquivado,     Estados.Suspenso,   Estados.Indefinido,     Estados.Indefinido,         Estados.Indefinido },
            /*DespachoDecisao*/  { Estados.Pagamento,        Estados.Arquivado,     Estados.Suspenso,   Estados.Indefinido,     Estados.Indefinido,         Estados.Indefinido},
            /*Pagamento*/        { Estados.Indefinido,       Estados.Indefinido,    Estados.Suspenso,   Estados.Indefinido,     Estados.DespachoDecisao,    Estados.Fechado},
            /*Fechado*/          { Estados.Indefinido,       Estados.Indefinido,    Estados.Indefinido, Estados.Indefinido,     Estados.DespachoDecisao,    Estados.Indefinido },
            /*Suspenso*/         { Estados.Indefinido,       Estados.Indefinido,    Estados.Indefinido, Estados.Candidatura,    Estados.Indefinido,         Estados.Indefinido },
            /*Arquivado*/        { Estados.Candidatura,      Estados.Indefinido,    Estados.Indefinido, Estados.Indefinido,     Estados.Indefinido,         Estados.Indefinido}
        };

        public static void EvoluiEstado(Evento e, Projecto p) {

            Estados proximoEstado = matrizTransicao[(int)p.EstadoActual, (int)e];
            if (proximoEstado == Estados.Indefinido)
                throw new InvalidOperationException(string.Format("Não é possível executar a acção {0} no estado {1}", e.ToString(), p.EstadoActual.ToString()));

            Estados estadoAnterior = p.EstadoActual;
            p.EstadoActual = proximoEstado;

            switch (e) {

                case Evento.Suspender: 
                    // guardar estado
                    p.EstadoAnterior = estadoAnterior;
                    break;
                case Evento.Reactivar:
                    //repor estado
                    p.EstadoActual = p.EstadoAnterior;
                    break;
            }

        }

        public static void MarcaEstadoInicial(Projecto p) {
            p.EstadoActual = Estados.Candidatura;
        }
    }
}
